import kotlinx.coroutines.*

suspend fun main() {
    // 创建自定义协程作用域
    val scope = CoroutineScope(Dispatchers.IO)

    // 启动协程
    scope.launch {
//        val str = fetchData()
//        println(str)

//        fetchSequential()

        fetchConcurrent()
    }


    // 阻塞主线程等待协程完成
//    Thread.sleep(1500L)
    delay(1500L)
    // 关闭作用域
    scope.cancel()
}

//顺序执行
suspend fun fetchSequential() {
    val data1 = fetchData1() // 挂起等待完成
    val data2 = fetchData2() // 上一个完成后才执行
    println("$data1 + $data2")
}

//并发执行
suspend fun fetchConcurrent() = coroutineScope {
    val deferred1 = async { fetchData1() }
    val deferred2 = async { fetchData2() }
    println("${deferred1.await()} + ${deferred2.await()}") // 同时等待结果
}

suspend fun fetchData(): String {
    delay(1000)  // 模拟耗时操作（挂起点）
    return "Data loaded"
}

suspend fun fetchData1(): String {
    delay(1400)  // 模拟耗时操作（挂起点）
    return "Data1 loaded"
}

suspend fun fetchData2(): String {
    delay(1000)  // 模拟耗时操作（挂起点）
    return "Data2 loaded"
}